home *** CD-ROM | disk | FTP | other *** search
- // $VER: FBackNG 1.2.1
- //
- // Purpose: backup/mirror files
- // Author: Chris De Maeyer
- // Copyright: Visionary Software (C)1998-99 Source and binary FREEWARE
- // History:
- // 07-04-1999 Creation
- // 15-04-1999 CLI options parser
- // 19-04-1999 Added registration, released first beta
- // 23-04-1999 Added log
- // 24-04-1999 Added logic for backup/mirror phase
- // 01-05-1999 Implemented backup phase
- // 02-05-1999 Fixed file/dir parser
- // Enabled security
- // 15-05-1999 Mirror phase implemented
- // Priority option
- // 16-05-1999 Before/after date option
- // Move options interpretation
- // 27-06-1999 Removed config
- // 30-10-1999 Added Delete phase
- // 10-12-1999 Added noarch option
- // 29-05-2001 Removed need for keyfile
-
- #include "dirdiver.h"
- #include "support.h"
- #include "key.h"
-
- #define VERSION "FBackNG V1.2.1"
-
- char version[]="\0$VER:"VERSION;
- char copyright[] ="(C) Visionary Software 1999 by Chris De Maeyer, FREEWARE.";
-
- long __stack=64*1024;
-
- struct Library *XpkBase;
- struct Task *thisTask;
-
- // Date handling
- struct DateTime dt_Before;
- struct DateTime dt_After;
-
- // CLI Options
- FLOPTS optflg;
- // CLI Parameters
- VAOPTS optval;
- // Counters
- ULONG tot_files;
- ULONG prc_files;
- ULONG del_dirs;
- ULONG tot_direc;
- // Globals
- extern char errormsg[256]; // in ddiver
- FILE *logfile;
- long newpri;
-
- extern int optind; // from getopt: next arg to process
- extern int opterr; // used by getopt
- extern char *optarg;
-
- // Functions
- // idiot user help
- void shorthelp(char *progname)
- {
- fprintf(stderr, "Usage to get help: %s -h\n",progname);
- }
-
- // -h option help
- void longhelp(char *progname)
- {
- printf("\n%s - performs daily backup of filesystems.\n\n",VERSION);
- printf("%s\n",copyright);
-
- printf("\nUsage: %s -b <path> -o <path>\n",progname);
- printf(" [-s][-r][-e][-t][-n][-m][-k][-c <packer>\n");
- printf(" [-d][-v <0|1|2|3>][-i <pri>][-g <pattern>]\n");
- printf(" [-u][-y <date>][-a <date>][-l <file>]\n\n");
- }
-
- // if CLI option with arg, filter out arg
- void getarg(char *progname,char opt,char *src,char *arg,int size)
- {
- int error = 0;
-
- if(src!=NULL)
- {
- if((*src == '-') || (*src == '\0'))
- error = 1;
- else
- strncpy(arg,src,size);
- }
- else
- error = 1;
-
- if(error)
- {
- fprintf(stderr,"%s: fatal: argument required for -%c\n",progname,opt);
- exit(1);
- }
- }
-
- void initarg(void)
- {
- // init option flags and values
- optflg.opt_source = 0; // source path (from) REQ
- optflg.opt_dest = 0; // destination path (to) REQ
- optflg.opt_simulate = 0; // simulate mode
- optflg.opt_recursive = 0; // recursive traversing
- optflg.opt_verbose = 0; // verbosity level
- optflg.opt_priority = 0; // set priority
- optflg.opt_compress = 0; // enable compression
- optflg.opt_every = 0; // ignore archive bit = all
- optflg.opt_touch = 0; // modify date/timestamp on destination
- optflg.opt_nonotes = 0; // do not copy filenotes
- optflg.opt_pattern = 0; // only process files matching pattern
- optflg.opt_log = 0; // write to log
- optflg.opt_before = 0; // only files < date (incl. given date)
- optflg.opt_after = 0; // only files > date (not incl. date)
- optflg.opt_mirror = 0; // do mirror phase
- optflg.opt_skip = 0; // skip backup phase
- optflg.opt_delete = 0; // do delete phase
- optflg.opt_noarch = 0; // do not set archive flag
-
- optval.val_temp[0] = 0;
- optval.val_source[0] = 0;
- optval.val_dest[0] = 0;
- optval.val_verbose = OUT_NORMAL;
- optval.val_compress[0] = 0;
- optval.val_pattern[0] = 0;
- optval.val_log[0] = 0;
- optval.val_before[0] = 0;
- optval.val_after[0] = 0;
-
- logfile = NULL;
- }
-
- void oncearg(char *prog)
- {
- int error;
- char username[LEN_PATH];
-
- // initiate log if active
- if(optflg.opt_log)
- {
- if((error = put_LogOneMsg(optval.val_log,"***** FBackNG Started...\n"))!=DD_OK)
- {
- fprintf (stderr, "%s: fatal: could not initiate log (%d)\n",prog,error);
- exit(1);
- }
- }
-
- // display banner after CLI parsing
- if(optval.val_verbose>OUT_QUIET)
- {
- printf("FBackNG - the daily file backup/mirror tool......\n");
- printf("(C)1999 Visionary Software - FREEWARE.\n\n");
- }
-
- // is the user registered
- // error = GetRegisteredUser("S:fbackng.key",username);
-
- //if(error==0)
- //{
- optflg.opt_validuser = TRUE;
- // memcpy(optval.val_user,&username[17],LEN_PATH-17);
-
- // sprintf(errormsg,"Registered to %s\n",optval.val_user);
- // check_write_log(NULL);
-
- // if(optval.val_verbose>OUT_QUIET)
- // printf("%s\n",errormsg);
- //}
- //else
- //{
- // optflg.opt_validuser = FALSE;
-
- // disable some stuff
- // optflg.opt_recursive = 0;
-
- // check_write_log("Unregistered Evaluation Version - no support !\n");
-
- // if(optval.val_verbose>OUT_QUIET)
- // {
- // printf("This is an Unregistered Evaluation Shareware program.\n");
- // printf("Some options are disabled in this state.\n");
- // printf("To encourage further development and to get support you must\n");
- // printf("register your copy of the program now.\n\n");
- // printf("Hit return to go on...\n");
- // getchar();
- // }
- //}
- }
-
- void intarg(char *prog)
- {
- if(optflg.opt_skip)
- {
- if(!optflg.opt_mirror)
- {
- sprintf(errormsg,"%s: fatal: skip without mirror\n",prog);
- check_write_log(NULL);
- fprintf (stderr, "%s",errormsg);
- exit (1);
- }
- }
-
- if(optflg.opt_before)
- {
- dt_Before.dat_Format = FORMAT_DOS;
- dt_Before.dat_StrDate = optval.val_before;
- dt_Before.dat_StrTime = NULL;
- dt_Before.dat_Flags = 0L;
- dt_Before.dat_StrDay = NULL;
-
- if(!(StrToDate(&dt_Before)))
- {
- sprintf(errormsg,"%s: fatal: invalid date for -y\n",prog);
- check_write_log(NULL);
- fprintf (stderr, "%s",errormsg);
- exit (1);
- }
- }
-
- if(optflg.opt_after)
- {
- dt_After.dat_Format = FORMAT_DOS;
- dt_After.dat_StrDate = optval.val_after;
- dt_After.dat_StrTime = NULL;
- dt_After.dat_Flags = 0L;
- dt_After.dat_StrDay = NULL;
-
- if(!(StrToDate(&dt_After)))
- {
- sprintf(errormsg,"%s: fatal: invalid date for -a\n",prog);
- check_write_log(NULL);
- fprintf (stderr, "%s",errormsg);
- exit (1);
- }
- }
-
- // if not configuration mode then both source + dest paths must be there
- if ((optflg.opt_source && optflg.opt_dest)==FALSE)
- {
- sprintf(errormsg,"%s: fatal: source and destination not found\n",prog);
- check_write_log(NULL);
- fprintf (stderr, "%s",errormsg);
- exit (1);
- }
-
- // check given paths for access
- if(!(Check_Dir(optval.val_source)))
- {
- sprintf (errormsg, "%s: fatal: source path not found\n",prog);
- check_write_log(NULL);
- fprintf (stderr, "%s",errormsg);
- exit(1);
- }
- if(!(Check_Dir(optval.val_dest)))
- {
- sprintf (errormsg, "%s: fatal: destination path not found\n",prog);
- check_write_log(NULL);
- fprintf (stderr, "%s",errormsg);
- exit(1);
- }
-
- // if no pattern given, select all
- if(strlen(optval.val_pattern)==0)
- strcpy(optval.val_pattern,"#?");
-
- // if compress mode, open xpk library
- if(optflg.opt_compress)
- {
- if(!(XpkBase=OpenLibrary(XPKNAME,0)))
- {
- sprintf (errormsg, "%s: fatal: could not open xpk library\n",prog);
- check_write_log(NULL);
- fprintf (stderr, "%s",errormsg);
- exit(1);
- }
- }
-
- if(optflg.opt_priority)
- {
- if(newpri>5) newpri = 5;
- SetTaskPri(thisTask,newpri);
-
- sprintf(errormsg,"Priority set to %ld\n",newpri);
- check_write_log(NULL);
-
- if(optval.val_verbose>OUT_QUIET)
- printf("%s\n",errormsg);
- }
-
- }
-
- int main(int argc, char *argv[])
- {
- char c;
- int dderror,count;
- char root[LEN_PATH];
-
- thisTask = FindTask(NULL);
-
- initarg();
-
- opterr = 1; // so getopt will print err msg
- count = 0;
-
- // parse options and fill structures
- while ((c = getopt (argc, argv, "bosrvicetnglyamkduh")) != EOF)
- {
- // error = 0;
-
- switch (c)
- {
- case 'b':
- count++;
- optflg.opt_source++;
- getarg(argv[0],c,argv[optind],optval.val_source,LEN_PATH);
- optind++;
- break;
-
- case 'o':
- count++;
- optflg.opt_dest++;
- getarg(argv[0],c,argv[optind],optval.val_dest,LEN_PATH);
- optind++;
- break;
-
- case 's':
- count++;
- optflg.opt_simulate++;
- break;
-
- case 'r':
- count++;
- optflg.opt_recursive++;
- break;
-
- case 'v':
- count++;
- optflg.opt_verbose++;
- getarg(argv[0],c,argv[optind],optval.val_temp,LEN_PATH);
- optval.val_verbose = atoi(optval.val_temp);
- optind++;
- break;
-
- case 'i':
- count++;
- optflg.opt_priority++;
- getarg(argv[0],c,argv[optind],optval.val_temp,LEN_PATH);
- newpri = atol(optval.val_temp);
- optind++;
- break;
-
- case 'c':
- count++;
- optflg.opt_compress++;
- getarg(argv[0],c,argv[optind],optval.val_compress,LEN_STRING);
- optind++;
- break;
-
- case 'e':
- count++;
- optflg.opt_every++;
- break;
-
- case 't':
- count++;
- optflg.opt_touch++;
- break;
-
- case 'n':
- count++;
- optflg.opt_nonotes++;
- break;
-
- case 'g':
- count++;
- optflg.opt_pattern++;
- getarg(argv[0],c,argv[optind],optval.val_pattern,LEN_STRING);
- optind++;
- break;
-
- case 'l':
- count++;
- optflg.opt_log++;
- getarg(argv[0],c,argv[optind],optval.val_log,LEN_PATH);
- optind++;
- break;
-
- case 'y':
- count++;
- optflg.opt_before++;
- getarg(argv[0],c,argv[optind],optval.val_before,LEN_STRING);
- optind++;
- break;
-
- case 'a':
- count++;
- optflg.opt_after++;
- getarg(argv[0],c,argv[optind],optval.val_after,LEN_STRING);
- optind++;
- break;
-
- case 'm':
- count++;
- optflg.opt_mirror++;
- break;
-
- case 'd':
- count++;
- optflg.opt_delete++;
- break;
-
- case 'k':
- count++;
- optflg.opt_skip++;
- break;
-
- case 'u':
- count++;
- optflg.opt_noarch++;
- break;
-
- case 'h':
- longhelp(argv[0]);
- exit(0);
-
- case '?':
- shorthelp(argv[0]);
- exit(0);
- }
- }
-
- // parsing finished, check consistency
- if (count == 0)
- {
- shorthelp(argv[0]);
- exit(1);
- }
-
- oncearg(argv[0]);
-
- // Dump the options given to the logfile if active
- if(optflg.opt_log)
- {
- for(c=1; c<argc; c++)
- {
- sprintf(errormsg,"Argument(%d) = %s\n",c,argv[c]);
- check_write_log(NULL);
- }
- }
-
- intarg(argv[0]);
-
- strcpy(root,optval.val_source);
-
- if(!optflg.opt_skip)
- {
- tot_files = 0;
- tot_direc = 0;
- prc_files = 0;
-
- check_write_log("----- Backup Phase\n");
-
- if(optval.val_verbose>OUT_QUIET)
- {
- printf("%s\n",STR_BACKUPPHASE);
- }
-
- dderror = DirDiver(root,BACKUP_PHASE);
-
- if(dderror != DD_OK)
- {
- sprintf (errormsg,"%s: fatal: backup process error (%d)\n",argv[0],dderror);
- check_write_log(NULL);
-
- fprintf (stderr, "%s\n",errormsg);
- check_write_log("***** FBackNG Ended.\n");
- exit(1);
- }
-
- if(optval.val_verbose>OUT_QUIET)
- {
- sprintf(errormsg,"Total files: %ld, Total Directories: %ld\n",tot_files,tot_direc);
- check_write_log(NULL);
- printf("%s",errormsg);
-
- sprintf(errormsg,"Files saved: %ld\n",prc_files);
- check_write_log(NULL);
- printf("%s",errormsg);
- }
- }
-
- if(optflg.opt_mirror)
- {
- tot_files = 0;
- tot_direc = 0;
- prc_files = 0;
-
- check_write_log("----- Mirror Phase\n");
-
- if(optval.val_verbose>OUT_QUIET)
- {
- printf("\n%s\n",STR_MIRRORPHASE);
- }
-
- strcpy(root,optval.val_dest);
-
- dderror = DirDiver(root,MIRROR_PHASE);
-
- if(dderror != DD_OK)
- {
- sprintf (errormsg,"%s: fatal: mirror process error (%d)\n",argv[0],dderror);
- check_write_log(NULL);
-
- fprintf (stderr, "%s\n",errormsg);
- check_write_log("***** FBackNG Ended.\n");
- exit(1);
- }
-
- if(optval.val_verbose>OUT_QUIET)
- {
- sprintf(errormsg,"Total files: %ld, Total Directories: %ld\n",tot_files,tot_direc);
- check_write_log(NULL);
- printf("%s",errormsg);
-
- sprintf(errormsg,"Files deleted: %ld\n",prc_files);
- check_write_log(NULL);
- printf("%s",errormsg);
- }
-
- }
-
- if(optflg.opt_delete)
- {
- tot_files = 0;
- tot_direc = 0;
- del_dirs = 0;
-
- check_write_log("----- Delete Phase\n");
-
- if(optval.val_verbose>OUT_QUIET)
- {
- printf("\n%s\n",STR_DELETEPHASE);
- }
-
- strcpy(root,optval.val_dest);
-
- dderror = DirCleaner(root);
-
- if(dderror != DD_OK)
- {
- sprintf (errormsg,"%s: fatal: delete process error (%d)\n",argv[0],dderror);
- check_write_log(NULL);
-
- fprintf (stderr, "%s\n",errormsg);
- check_write_log("***** FBackNG Ended.\n");
- exit(1);
- }
-
- if(optval.val_verbose>OUT_QUIET)
- {
- sprintf(errormsg,"Total Directories: %ld\n",tot_direc);
- check_write_log(NULL);
- printf("%s",errormsg);
-
- sprintf(errormsg,"Directories deleted: %ld\n",del_dirs);
- check_write_log(NULL);
- printf("%s",errormsg);
- }
-
- }
-
-
- check_write_log("***** FBackNG Ended.\n");
- exit(0);
- }
-